bitkeeper revision 1.1159.1.568 (420ba33bo4Ly13qI5cHgZttHha5_-g)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 10 Feb 2005 18:08:59 +0000 (18:08 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 10 Feb 2005 18:08:59 +0000 (18:08 +0000)
Change do_set_callbacks hypercall for x86/64 to not take any selector
values, but to take a syscall_entry point.
Signed-off-by: keir.fraser@cl.cam.ac.uk
xen/arch/x86/traps.c
xen/arch/x86/x86_32/traps.c
xen/arch/x86/x86_64/asm-offsets.c
xen/arch/x86/x86_64/entry.S
xen/arch/x86/x86_64/traps.c
xen/include/asm-x86/domain.h

index 9e91a48540080f16e2b37e1449d5d99308f0d354..44b1366105febc0c2486b03c590abe227c64518a 100644 (file)
@@ -808,25 +808,6 @@ long do_set_trap_table(trap_info_t *traps)
 }
 
 
-long do_set_callbacks(unsigned long event_selector,
-                      unsigned long event_address,
-                      unsigned long failsafe_selector,
-                      unsigned long failsafe_address)
-{
-    struct exec_domain *d = current;
-
-    if ( !VALID_CODESEL(event_selector) || !VALID_CODESEL(failsafe_selector) )
-        return -EPERM;
-
-    d->arch.event_selector    = event_selector;
-    d->arch.event_address     = event_address;
-    d->arch.failsafe_selector = failsafe_selector;
-    d->arch.failsafe_address  = failsafe_address;
-
-    return 0;
-}
-
-
 long do_fpu_taskswitch(void)
 {
     set_bit(EDF_GUEST_STTS, &current->ed_flags);
index ef8cc53c722e8ec908e7c07d196c1d50f4f10729..68463a253cb76552050db13ca86a717b3bbd468e 100644 (file)
@@ -274,3 +274,21 @@ long do_set_fast_trap(int idx)
 {
     return set_fast_trap(current, idx);
 }
+
+long do_set_callbacks(unsigned long event_selector,
+                      unsigned long event_address,
+                      unsigned long failsafe_selector,
+                      unsigned long failsafe_address)
+{
+    struct exec_domain *d = current;
+
+    if ( !VALID_CODESEL(event_selector) || !VALID_CODESEL(failsafe_selector) )
+        return -EPERM;
+
+    d->arch.event_selector    = event_selector;
+    d->arch.event_address     = event_address;
+    d->arch.failsafe_selector = failsafe_selector;
+    d->arch.failsafe_address  = failsafe_address;
+
+    return 0;
+}
index fa816d26101cd89d44a6ef107f8da34cdfd0bddf..309afbc6ee74cf68fee53f5bce9235ec09598abc 100644 (file)
@@ -43,10 +43,9 @@ void __dummy__(void)
 
     OFFSET(EDOMAIN_processor, struct exec_domain, processor);
     OFFSET(EDOMAIN_vcpu_info, struct exec_domain, vcpu_info);
-    OFFSET(EDOMAIN_event_sel, struct exec_domain, arch.event_selector);
     OFFSET(EDOMAIN_event_addr, struct exec_domain, arch.event_address);
-    OFFSET(EDOMAIN_failsafe_sel, struct exec_domain, arch.failsafe_selector);
     OFFSET(EDOMAIN_failsafe_addr, struct exec_domain, arch.failsafe_address);
+    OFFSET(EDOMAIN_syscall_addr, struct exec_domain, arch.syscall_address);
     OFFSET(EDOMAIN_trap_bounce, struct exec_domain, arch.trap_bounce);
     OFFSET(EDOMAIN_thread_flags, struct exec_domain, arch.flags);
     OFFSET(EDOMAIN_kernel_sp, struct exec_domain, arch.kernel_sp);
index 8c00a685ad1a2dfb0c10ffdbc296e88d98470b61..ccd792fd52e5029f86bcceada410dcbe8bfbde80 100644 (file)
@@ -104,12 +104,15 @@ ENTRY(syscall_enter)
         movl  $TRAP_syscall,4(%rsp)
         SAVE_ALL
         GET_CURRENT(%rbx)
-        bts   $_TF_kernel_mode,EDOMAIN_thread_flags(%rbx)
-        jc    hypercall
-        swapgs
-        movq  %rbx,%rdi
-        call  SYMBOL_NAME(write_ptbase)
-        jmp   restore_all_guest
+        testb $TF_kernel_mode,EDOMAIN_thread_flags(%rbx)
+        jnz   hypercall
+
+        leaq  EDOMAIN_trap_bounce(%rbx),%rdx
+        movq  EDOMAIN_syscall_addr(%rbx),%rax
+        movq  %rax,TRAPBOUNCE_eip(%rdx)
+        movw  $0,TRAPBOUNCE_flags(%rdx)
+        pushq restore_all_guest(%rip)
+        jmp   create_bounce_frame
 
 hypercall:
         sti
index 27143d8cf90239c8b39cd4b53d1570f345e806ec..cbd96c073189966374ca386aaca9fa88f241c71a 100644 (file)
@@ -256,3 +256,16 @@ void *decode_reg(struct xen_regs *regs, u8 b)
 
     return NULL;
 }
+
+long do_set_callbacks(unsigned long event_address,
+                      unsigned long failsafe_address,
+                      unsigned long syscall_address)
+{
+    struct exec_domain *d = current;
+
+    d->arch.event_address    = event_address;
+    d->arch.failsafe_address = failsafe_address;
+    d->arch.syscall_address  = syscall_address;
+
+    return 0;
+}
index d8821f50e38d69ca43b874af902fba5a513c0718..32205b63b4d39145a90482898425f86aecf954a3 100644 (file)
@@ -68,12 +68,15 @@ struct arch_exec_domain
      * for segment registers %ds, %es, %fs and %gs:
      *         %ds, %es, %fs, %gs, %eip, %cs, %eflags [, %oldesp, %oldss]
      */
-    unsigned long event_selector;    /* entry CS  */
+
+    unsigned long event_selector;    /* entry CS  (x86/32 only) */
     unsigned long event_address;     /* entry EIP */
 
-    unsigned long failsafe_selector; /* entry CS  */
+    unsigned long failsafe_selector; /* entry CS  (x86/32 only) */
     unsigned long failsafe_address;  /* entry EIP */
 
+    unsigned long syscall_address;   /* entry EIP (x86/64 only) */
+
     /* Bounce information for propagating an exception to guest OS. */
     struct trap_bounce trap_bounce;